package com.oa.framework.acc.account.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.oa.framework.acc.account.domain.AccountPrincipal;
import com.oa.framework.acc.account.domain.UserAccount;
import com.oa.framework.acc.account.domain.UserSecurityInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author cuichao
 */
@Component
public interface UserAccountDao extends BaseMapper<UserAccount> {

    /**
     * 分页查询 page
     *
     * @param page
     * @return
     */
    IPage<UserAccount> searchAccountIncludePriorityPrincipal(IPage<UserAccount> page);

    /**
     * 根据账号ID加载用户账号(多身份)信息
     *
     * @param accountId
     * @return
     */
    UserAccount getUserAccountIncludePrincipalsByAccountId(long accountId);

    /**
     * 加载用户安全信息
     *
     * @param accountName
     * @return
     */
    UserSecurityInfo loadUserAccountSecurityInfo(String accountName);

    /**
     * 更新用户账号基本信息
     *
     * @param account
     * @return
     */
    int updateUserAccountSecurityInfo(@Param("account") UserAccount account);

    /**
     * 创建身份
     *
     * @param accountId
     * @param principal
     * @return
     */
    int addUserAccountPrincipal(@Param("accountId") Long accountId, @Param("principal") AccountPrincipal principal);

    /**
     * 更新用户身份
     *
     * @param accountId
     * @param principal
     * @return
     */
    int updateUserAccountPrincipal(@Param("accountId") Long accountId, @Param("principal") AccountPrincipal principal);

    /**
     * 添加用户身份
     *
     * @param accountId
     * @param principals
     * @return
     */
    int addUserAccountPrincipals(@Param("accountId") Long accountId, @Param("principals") List<AccountPrincipal> principals);

    /**
     * 为账户设置主要身份
     *
     * @param accountId
     * @param priorityPrincipalId
     * @return
     */
    int setAccountPriorityPrincipal(@Param("accountId") Long accountId, @Param("priorityPrincipalId") Long priorityPrincipalId);


    /**
     * 移除用户身份
     *
     * @param principalId
     * @param accountId
     * @return
     */
    int removeUserAccountPrincipal(@Param("accountId") Long accountId, @Param("principalId") Long principalId);

    /**
     * 移除所有用户身份
     *
     * @param accountId
     * @return
     */
    int removeUserAccountPrincipals(Long accountId);
}
